先來看一下結論,因為 eql? 及 equal? 的用法與 == 類似,這邊也順便介紹一下他們的用法。
p 666 == 666.0 # true,左邊的型態是 Fixnum,右邊的型態是 Float,但值都是 666,== 只要值一樣就會判定是 true
p 666.eql?(666.0) # false,左邊的型態是 Fixnum,右邊的型態是 Float,雖然值都是 666,但 eql? 如果型態不同就會判定是 false
a = "五倍券"
b = c = "五倍券"
p a.equal?(b) # false,雖然 a 跟 b 都是指向五倍券的字串,但他們並不是指向相同的記憶體位置,字串的記憶體位置會隨著你每次的宣告而變動,符號則不會,這邊如果把字串改成符號,那答案就會是 true。
p b.equal?(c) # true,b、c 都是指向同個記憶體位置的五倍券
p a.object_id # 60,用 object_id 來確認記憶體位置,a 為 60
p b.object_id # 80,用 object_id 來確認記憶體位置,b、c 為 80
p c.object_id # 80
不同型別的 === 比較方式會不一樣。
像是 Range 會測試右邊的值是否落在左邊的範圍內。
Regexp(正規表達式) 會測試右邊的字串是否相符於左邊的正規表達式。
Class 會測試右邊的值的型態是否跟左邊的型態一樣。
Symbol 會測試右邊的型態是否為 Symbol 且值是否一樣。
p (1..10) === 8 # true,8 被包含在 1~10 以內
p /\d/ === "123abc" # true,字串相符於正規表達式,\d 表示字串內是否含有數字
p Fixnum === 123 # true,123 的型態是 Fixnum
p :a === :a # true,右邊的型態是符號,且值都是 a
p :a === "a" # false,雖然左右兩邊的值都是 a,但型態不同
=== 常用在 case when 內,一般我們都會用範例2的寫法來使用 case when,Ruby 會自動轉成範例3的方式來幫我們比較。
另外補充一下 case when 的用法(如範例2),比較完之後要給出的答案有三種寫法
x = 3
p case x
when 1
"one"
when 2 ; "two"
when 3 then "three"
else "many"
end
# 印出 three
x = 3
p case x
when 1 === x then "one"
when 2 === x then "two"
when 3 === x then "three"
else "many"
end
參考:
[1]The Ruby Programming Language (O'REILLY)